/* eslint-disable no-labels */
/* 124578@Ab12 */
function Valid(rule, value) {
  const regex =
    /((^(?=.*[a-z])(?=.*[A-Z])(?=.*\W)[\da-zA-Z_~!@#\$%\^\*_\-\+{\[\]}:,.?\/]{10,32}$)|(^(?=.*\d)(?=.*[A-Z])(?=.*\W)[\da-zA-Z_~!@#\$%\^\*_\-\+{\[\]}:,.?\/]{10,32}$)|(^(?=.*\d)(?=.*[a-z])(?=.*\W)[\da-zA-Z_~!@#\$%\^\*_\-\+{\[\]}:,.?\/]{10,32}$)|(^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[\da-zA-Z_~!@#\$%\^\*_\-\+{\[\]}:,.?\/]{10,32}$))/
  // const regex2 = /^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_]+$)(?![a-z0-9]+$)(?![a-z\W_]+$)(?![0-9\W_]+$)[a-zA-Z0-9\W_]{10,32}$/;
  // const regex2=/^(?=.*[A-Z])(?=.*[a-z])(?=.*\d|.*[~!@#\$%\^&\*_\-\+{\[\]}:,.?\/]).{10,32}$/

  if (!regex.test(value)) {
    return Promise.reject(
      new Error(
        '密码长度为10~32个字符且密码由大写字母、小写字母、数字和特殊字符组成，至少3种组合'
      )
    )
  }
  if (!ChStr(value)) {
    return Promise.reject(
      new Error(
        '密码长度为10~32个字符且密码由大写字母、小写字母、数字和特殊字符组成，至少3种组合'
      )
    )
  }
  // const re = /(\w)*(\w)\2{2}(\w)*/g
  const re = /(.)*(.)\2{2}(.)*/g
  if (re.test(value)) {
    return Promise.reject(new Error('不能相同字符连续3位或3位以上（111、aaa）'))
  }

  if (!LxStr(value)) {
    return Promise.reject(new Error('不能使用连续3个及以上字符（123、abc）'))
  }

  if (LxKeyStr(value)) {
    return Promise.reject(new Error('不能使用键盘上连续4个字符（!QAZ、qwer）'))
  }
  return Promise.resolve()
}

// 不能连续字符（如123、abc）连续3位或3位以上
function LxStr(str) {
  var arr = str.split('')
  var flag = true
  for (var i = 1; i < arr.length - 1; i++) {
    var firstIndex = arr[i - 1].charCodeAt()
    var secondIndex = arr[i].charCodeAt()
    var thirdIndex = arr[i + 1].charCodeAt()
    if (
      (thirdIndex - secondIndex === 1 && secondIndex - firstIndex === 1) ||
      (secondIndex - thirdIndex === 1 && firstIndex - secondIndex === 1)
    ) {
      flag = false
    }
  }
  return flag
}
// 不能键盘上连续4个字符（横向或纵向）
function LxKeyStr(str) {
  // 定义横向穷举
  const keyCode = [
    [
      '`~·',
      '1!',
      '2@@',
      '3#',
      '4$￥',
      '5%',
      '6^……',
      '7&',
      '8*',
      '9(（',
      '0）)',
      '-_',
      '=+'
    ],
    [
      ' ',
      'qQ',
      'wW',
      'eE',
      'rR',
      'tT',
      'yY',
      'uU',
      'iI',
      'oO',
      'pP',
      '[{【',
      ']}】',
      '\\|、'
    ],
    [' ', 'aA', 'sS', 'dD', 'fF', 'gG', 'hH', 'jJ', 'kK', 'lL', ';:', '\'"’“'],
    [' ', 'zZ', 'xX', 'cC', 'vV', 'bB', 'nN', 'mM', ',《<', '.>》', '/?？']
  ]

  // 找出给出的字符串，每个字符，在坐标系中的位置。
  const x = []
  const y = []
  for (let i = 0; i < str.length; i++) {
    const temp = str[i]
    toHere: for (let j = 0; j < keyCode.length; j++) {
      for (let k = 0; k < keyCode[j].length; k++) {
        const jk = keyCode[j][k]
        if (jk.includes(String(temp))) {
          x.push(j)
          y.push(k)
          break toHere
        }
      }
    }
  }
  let flag = false
  for (let i = 0; i < x.length - 3; i++) {
    // 如果X一致，那么就是在一排
    if (x[i] === x[i + 1] && x[i + 1] === x[i + 2] && x[i + 2] === x[i + 3]) {
      // 四者在同一行上
      if (y[i] > y[i + 3]) {
        if (
          y[i] - 1 === y[i + 1] &&
          y[i] - 2 === y[i + 2] &&
          y[i] - 3 === y[i + 3]
        ) {
          flag = true
          break
        }
      } else {
        if (
          y[i] + 1 === y[i + 1] &&
          y[i] + 2 === y[i + 2] &&
          y[i] + 3 === y[i + 3]
        ) {
          flag = true
          break
        }
      }
    } else if (
      x[i] !== x[i + 1] &&
      x[i + 1] !== x[i + 2] &&
      x[i] !== x[i + 2] &&
      x[i] !== x[i + 3] &&
      x[i + 1] !== x[i + 3] &&
      x[i + 2] !== x[i + 3]
    ) {
      // 四者均不在同一行上,但是如果y相同，说明是一列
      if (y[i] === y[i + 1] && y[i + 1] === y[i + 2] && y[i + 2] === y[i + 3]) {
        if (x[i] > x[i + 3]) {
          if (
            x[i] - 1 === x[i + 1] &&
            x[i] - 2 === x[i + 2] &&
            x[i] - 3 === x[i + 3]
          ) {
            flag = true
            break
          }
        } else {
          if (
            x[i] + 1 === x[i + 1] &&
            x[i] + 2 === x[i + 2] &&
            x[i] + 3 === x[i + 3]
          ) {
            flag = true
            break
          }
        }
      } else if (
        y[i] + 1 === y[i + 1] &&
        y[i + 1] + 1 === y[i + 2] &&
        y[i + 2] + 1 === y[i + 3]
      ) {
        flag = true
        break
      } else if (
        y[i] - 1 === y[i + 1] &&
        y[i + 1] - 1 === y[i + 2] &&
        y[i + 2] - 1 === y[i + 3]
      ) {
        flag = true
        break
      }
    }
  }
  return flag
}
// 校验中文字符
function ChStr(str) {
  var arr = str.split('')
  var flag = true
  for (var i = 0; i < arr.length; i++) {
    if (arr[i].charCodeAt() > 126) {
      flag = false
    }
    // 校验空格
    if (arr[i].charCodeAt() === 32) {
      flag = false
    }
  }
  return flag
}
export default Valid
